import javax.swing.JFrame; // 导入JFrame窗口类
import javax.swing.SwingUtilities; // 导入Swing工具类
import javax.swing.JPanel; // 导入面板组件
import javax.swing.JButton; // 导入按钮组件
import javax.swing.JTextField; // 导入文本框组件
import javax.sound.sampled.*;// 导入相关新增音频
import java.awt.event.ActionListener; // 导入动作监听接口
import java.time.LocalTime;
import java.awt.event.ActionEvent; // 导入动作事件类
import java.awt.BorderLayout; // 导入边界布局管理器
import java.awt.GridLayout; // 导入网格布局管理器
import java.awt.Dimension; // 导入尺寸类
import java.awt.Font; // 导入字体类
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//Calculator类继承自JFrame，表示这是一个窗口应用程序
//实现了ActionListener接口，用于处理按钮点击事件
//定义了界面组件作为成员变量
public class Calculator extends JFrame implements ActionListener{
    private JPanel north, center; //上下两个容器面板
    private JTextField field; // 显示计算过程和结果的文本框
    private JButton[] btns; // 按钮数组
    private Clip clickSound; // 用于播放点击声音

    public Calculator(){
        setTitle("计算器");// 设置窗口标题
        setSize(700,700);//设置窗口大小
        setDefaultCloseOperation(EXIT_ON_CLOSE);//设置窗口关闭时程序
        setLocationRelativeTo(null);//设置窗口居中显示
        initComponent();//初始化界面组件
        setVisible(true);//显示窗口
    }
     private void playClickSound() {
        Toolkit.getDefaultToolkit().beep(); // 使用系统默认提示音
    }

    
    //初始化界面组件
    private void initComponent(){
        //System.out.println("initComponent");
        north = new JPanel();//创建面板容器 容器面板 文本框区域
        center = new JPanel();//容器面板 按钮区域

        //初始化文本框
        field = new JTextField();
        field.setPreferredSize(new Dimension(700,150));//设置文本框大小
        field.setEditable(false);//禁用电脑直接编辑
        field.setFont(new Font("SansSerif",Font.BOLD,35));//设置字体

        //按钮标签数据  private JButton[] btns;
        String[] str = new String[]{
             "7", "8", "9", "+",
             "4", "5", "6", "-",
             "1", "2", "3", "×",
             "0", ".", "=", "÷",
             "C", "B", "T", "S"
        };

        //初始化按钮数组
        btns = new JButton[str.length];
        for(int i = 0;i<btns.length;i++){
            btns[i] = new JButton(str[i]);
            btns[i].setFont(new Font("SansSerif",Font.BOLD,25));
        }

        //设置布局管理器
        north.setLayout(new BorderLayout());//north 顶部面板 使用BorderLayout 边界布局
        center.setLayout(new GridLayout(5,4));//center 中间面板 使用5行4列网格布局
        //field 文本框添加到north顶部面板 
        north.add(field,BorderLayout.CENTER); 
        for(JButton btn : btns){
            center.add(btn);
        }
        
        //添加组件
        north.add(field,BorderLayout.NORTH);//文本框添加到顶部面板中央
        for(JButton btn : btns) {
        center.add(btn); // 所有按钮添加到中间面板
    }
        //将面板添加到窗口
        add(north, BorderLayout.NORTH);//顶部面板放在窗口北部
        add(center);//中间面板放在窗口中央
       
        //绑定按钮的监听事件
        for(JButton btn : btns){
            btn.addActionListener(this);
        }
    }
    private void setBtnText(String text) {
    playClickSound(); // 每次点击按钮播放系统提示音
    
    String current = field.getText();
    switch(text) {
        case "C": 
            field.setText("");// 清空显示屏
            break;
            
        case "B":
           if (!current.isEmpty()) {  // 检查显示框是否非空 
            //**检查 current 是否非空（避免空字符串操作）
            //**使用 substring 截取除最后一个字符外的内容
                field.setText(current.substring(0, current.length() - 1));  // 删除最后一个字符
        }
        break;
            
        case "T": // 显示当前时间
        //**LocalTime.now() 获取当前时间（格式：HH:mm:ss.SSS）
        //**substring(0, 8) 截取前8位（去掉毫秒部分
            field.setText(java.time.LocalTime.now().toString().substring(0, 8));
            break;
            
        case "S": 
            try {
                double num = Double.parseDouble(current);//将当前文本转为数字
                field.setText(String.valueOf(num * num));//计算平方并显示
            } catch (Exception e) {
                field.setText("Error");//转换失败时显示错误
            }
            break;
            
        case "=": // 计算
            try {
                String expr = current.replace("×", "*").replace("÷", "/");//符号替换：将 × 和 ÷ 替换为 * 和 /（适配JS引擎语法）
                // 使用JavaScript引擎计算（简单实现）
                javax.script.ScriptEngine engine = 
                    new javax.script.ScriptEngineManager().getEngineByName("js");//获取JS引擎
                Object result = engine.eval(expr);//执行计算
                field.setText(result.toString());//显示结果
            } catch (Exception e) {
                field.setText("Error");
            }
            break;
            
        default: // 数字和运算符
            field.setText(current + text);//处理数字（0-9）、小数点（.）和运算符（+-×÷）
    }
}
    public void actionPerformed(ActionEvent a){
        //System.out.println(a);//打印事件信息
        Object source = a.getSource();//获取被点击的按钮或文字
        if (source instanceof JButton) {
            JButton btn = (JButton) source;
            String text = btn.getText();
            //System.out.println(text);
            setBtnText(text);
        }
    }
    public static void main(String[] args) {
        //System.out.println("hello,Calculator");
        //new Calculator();
        SwingUtilities.invokeLater(Calculator::new);
}
}